#include "../common/message.hpp"

int main()
{
    // 两种方式初始化
    // 1 bitpr::BaseMessage::ptr bmp=bitpr::MessageFactory::create(bitpr::MType::REQ_RPC);
    // bitpr::RpcRequest::ptr rrp=std::dynamic_pointer_cast<bitpr::RpcRequest>(bmp);//本来这个父类对象bmp不能直接转换为这个子类对象,可以用这种方式

    // 2
    // 检查序列化
    //  bitpr::RpcRequest::ptr rrp=bitpr::MessageFactory::create<bitpr::RpcRequest>();
    //  Json::Value param;
    //  param["num1"]=11;
    //  param["num2"]=22;
    //  rrp->setMethod("Add");
    //  rrp->setParams(param);
    //  std::string str=rrp->serialize();
    //  std::cout<<str<<std::endl;
    //  //反序列化
    //  // bitpr::BaseMessage::ptr bmp=bitpr::MessageFactory::create(bitpr::MType::REQ_RPC);
    //  // bool ret=bmp->unserialize(str);
    //  // if(ret==false)
    //  // {
    //  //     return -1;
    //  // }
    //  // //检查函数测试
    //  // ret =bmp->check();
    //  // if(ret==false)
    //  // {
    //  //     return -1;
    //  // }
    //  // bitpr::RpcRequest::ptr rrp2=std::dynamic_pointer_cast<bitpr::RpcRequest>(bmp);
    //  // std::cout<<rrp2->method()<<std::endl;
    //  // std::cout<<rrp2->params()["num1"].asInt()<<std::endl;
    //  // std::cout<<rrp2->params()["num2"].asInt()<<std::endl;



//     //测试toPic 
//     bitpr::TopicRequest::ptr ttp = bitpr::MessageFactory::create<bitpr::TopicRequest>();

//     ttp->setTopicMsg("Hello");
//    ttp->setTopicKey("news");
//     ttp->setTopicOptype(bitpr::TopicOptype::TOPIC_PUBLISH);//右值引用问题
//     std::string str = ttp->serialize();
//     std::cout << str << std::endl;
//     bitpr::BaseMessage::ptr bmp = bitpr::MessageFactory::create(bitpr::MType::REQ_TOPIC);
//     bool ret = bmp->unserialize(str);
//     if (ret == false)
//     {
//         return -1;
//     }
//     // 检查函数测试
//     ret = bmp->check();
//     if (ret == false)
//     {
//         return -1;
//     }
//     bitpr::TopicRequest::ptr ttp2 = std::dynamic_pointer_cast<bitpr::TopicRequest>(bmp);
//     std::cout << ttp2->topicKey() << std::endl;
//     std::cout << (int)ttp2->optype() << std::endl;

//     std::cout << ttp2->topicMsg() << std::endl;


//这个是ServiceRequest的测试
// bitpr::ServiceRequest::ptr ssp = bitpr::MessageFactory::create<bitpr::ServiceRequest>();

// ssp->setMethod("Hello");
// ssp->setOptype(bitpr::ServiceOptype::SERVICE_REGISTRY);
// ssp->setHost(bitpr::Address("127.0.0.0",9090));

// std::string str = ssp->serialize();
// std::cout << str << std::endl;
// bitpr::BaseMessage::ptr bmp = bitpr::MessageFactory::create(bitpr::MType::REQ_SERVICE);
// bool ret = bmp->unserialize(str);
// if (ret == false)
// {
//     return -1;
// }
// // 检查函数测试
// ret = bmp->check();
// if (ret == false)
// {
//     return -1;
// }
// bitpr::ServiceRequest::ptr rrp2 = std::dynamic_pointer_cast<bitpr::ServiceRequest>(bmp);
// std::cout << rrp2->method() << std::endl;
// std::cout << (int)rrp2->optype() << std::endl;
// std::cout << rrp2->host().first<< std::endl;
// std::cout << rrp2->host().second<< std::endl;


//RSP的测试
// bitpr::RpcResponse::ptr rrs = bitpr::MessageFactory::create<bitpr::RpcResponse>();
// // Json::Value val;
// // val=33;
// rrs->setRCode(bitpr::RCode::RCODE_OK);
// rrs->setResult(33);

// std::string str = rrs->serialize();
// std::cout << str << std::endl;
// bitpr::BaseMessage::ptr bmp = bitpr::MessageFactory::create(bitpr::MType::RSP_RPC);
// bool ret = bmp->unserialize(str);
// if (ret == false)
// {
//     return -1;
// }
// // 检查函数测试
// ret = bmp->check();
// if (ret == false)
// {
//     return -1;
// }
// bitpr::RpcResponse::ptr rrp2 = std::dynamic_pointer_cast<bitpr::RpcResponse>(bmp);
// std::cout << (int)rrp2->rcode() << std::endl;
// std::cout << rrp2->result().asInt() << std::endl;


//这个是TopicResqonse测试文件
// bitpr::TopicResponse::ptr tre = bitpr::MessageFactory::create<bitpr::TopicResponse>();
// // Json::Value val;
// // val=33;
// tre->setRCode(bitpr::RCode::RCODE_OK);
// std::string str = tre->serialize();
// std::cout << str << std::endl;
// bitpr::BaseMessage::ptr bmp = bitpr::MessageFactory::create(bitpr::MType::RSP_TOPIC);
// bool ret = bmp->unserialize(str);
// if (ret == false)
// {
//     return -1;
// }
// // 检查函数测试
// ret = bmp->check();
// if (ret == false)
// {

//     return -1;
// }
//  bitpr::TopicResponse::ptr rrp2 = std::dynamic_pointer_cast<bitpr::TopicResponse>(bmp);
// std::cout << (int)rrp2->rcode() << std::endl;


bitpr::ServiceResponse::ptr tre = bitpr::MessageFactory::create<bitpr::ServiceResponse>();
// Json::Value val;
// val=33;
tre->setRCode(bitpr::RCode::RCODE_OK);
tre->setMethod("ADD");
tre->setOptype(bitpr::ServiceOptype::SERVICE_DISCOVERY);
std::vector<bitpr::Address> addrs;
addrs.push_back(bitpr::Address("127.0.0.0",9090));
addrs.push_back(bitpr::Address("127.0.0.0",9091));

tre->setHost(addrs);
std::string str = tre->serialize();
std::cout << str << std::endl;
bitpr::BaseMessage::ptr bmp = bitpr::MessageFactory::create(bitpr::MType::RSP_SERVICE);
bool ret = bmp->unserialize(str);
if (ret == false)
{
    return -1;
}
// 检查函数测试
ret = bmp->check();
if (ret == false)
{
    
    return -1;
}
 bitpr::ServiceResponse::ptr rrp2 = std::dynamic_pointer_cast<bitpr::ServiceResponse>(bmp);

 std::cout << (int)rrp2->rcode() << std::endl;
 std::cout << rrp2->method() << std::endl;
 std::cout << (int)rrp2->optype() << std::endl;
 std::vector<bitpr::Address> addrs1=rrp2->hosts();
 
 for(auto&addr:addrs1)
 {
    std::cout<<addr.first<<" "<<addr.second<<std::endl;

 }
 
    return 0;
}